#include <bits/stdc++.h>
using namespace std;
int main() {

  //	freopen("meet.in","r",stdin);
  //	freopen("meet.out","w",stdout);

  int N, Q, a[51] = {0};
  cin >> N >> Q;                 //读入N,Q
  for (int i = 1; i <= N; i++) { //循环N组
    int t;
    cin >> t;                      //每组开始于一个t
    for (int j = 1; j <= t; j++) { //循环t次
      int y;
      cin >> y; //每次读取一个y
      a[y]++;   //桶排序 把y放进桶里 a[y]++ 代表y出现的次数+1
    }
  }

  int k = 0; // 找到出现次数最多的那个数 也就是最大值的下标
  for (int i = 1; i <= 50; i++) {
    if (a[i] > a[k])
      k = i; //更新最大值的下标
  }
  if (a[k] < Q)
    cout << 0;
  else {
    cout << k; //输出第一次出现最大值对应的下标
  }
  return 0;
}
/**
 * 开会时间
一年一度的信息学奥林匹克总结大会准备召开了，但大会负责人Mr.Huang却遇到了麻烦，参加会议的各中小学信息学教练都非常非常忙，因为他们不但要担任竞赛的辅导工作，而且还有常规的教学工作，有的还担任学校的行政职务，因此要召集他们都来开会是一件非常困难的事，为了让更多的人来参加会议，时间的选择非常关键。因此Mr.Huang让他们每个人交一份空闲时间表（单位：天，最大值为100），他们也只能在空闲的时间才能来开会。Mr.Huang请你通过他们提供的空闲时间表来确定开会的时间（会开1整天）。自然是能来的人越多越好，在这个前提下，请你确定某一天开会，如何能来的人数相同的话，会越早开越好，当然如何与会人数小于组委会设定的最少人数，会议将被取消。



【输入描述】

第一行为两个正整数N，Q（1≤Q≤N≤50），其中N表示信息学教练的总人数，Q表示至少需要多少信息学教练参加，使得会议能够召开。

接下来有N行，第i行表示第i个教练有空的时间。



【输出描述】

只有一个整数，为开会的最早时间，如果与会人数少于组委会设定的人数Q，会议被取消，则输出“0”。



【示例0】

【输入】

4 3

4 1 5 8 9

3 2 5 9

5 2 4 5 7 9

4 2 4 9 15



【输出】

9
 */